package com.boruishangge.persagysdk.uitls;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;

import androidx.annotation.NonNull;

import com.boruishangge.persagysdk.R;
import com.boruishangge.persagysdk.view.CustomHeadImageView;
import com.boruishangge.persagysdk.view.TextDrawable;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;

import java.io.File;



/**
 * Glide工具类
 * Created by mxy on 2017/3/4 0004.
 */

public class GlideUtils {

    /**
     * Glide特点
     * 使用简单
     * 可配置度高，自适应程度高
     * 支持常见图片格式 Jpg png gif webp
     * 支持多种数据源  网络、本地、资源、Assets 等
     * 高效缓存策略    支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
     * 生命周期集成   根据Activity/Fragment生命周期自动管理请求
     * 高效处理Bitmap  使用Bitmap Pool使Bitmap复用，主动调用recycle回收需要回收的Bitmap，减小系统回收压力
     * 这里默认支持Context，Glide支持Context,Activity,Fragment，FragmentActivity
     */


    //默认加载
    public static void loadImageView(Context mContext, String path, ImageView mImageView, int loadImgRes) {
        GlideApp.with(mContext).load(path).placeholder(loadImgRes).dontAnimate().into(mImageView);
    }

    //默认加载本地图片
    public static void loadImageView(Context mContext, int resId, ImageView mImageView) {
        GlideApp.with(mContext).load(resId).into(mImageView);
    }

    //加载sd卡图片
    public static void loadImageViewFromSDcard(Context mContext, String filePath, ImageView mImageView) {
        int width = DensityUtils.dp2px(mContext, 210);
        int hight = DensityUtils.dp2px(mContext, 150);
        GlideApp.with(mContext)
                .load(new File(filePath))
                .transform(new GlideRoundTransform(mContext, 5))
                .skipMemoryCache(false)
                .override(width, hight)
                .into(mImageView);
    }


//    public static void loadImageView(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).crossFade().dontAnimate().into(mImageView);
//    }
//
//    //设置圆角图片
//    public static void loadImageViewTransformation(Context mContext, String path, ImageView mImageView,int loadImgRes) {
//        Glide.with(mContext)
//                .load(path)
//                .transform(new GlideRoundTransform(mContext,5))
//                .placeholder(loadImgRes)
//                .crossFade()
//                .into(mImageView);
//        Glide.with(mContext).load(path).centerCrop().bitmapTransform
//                (new RoundedCornersTransformation(mContext,15,0, RoundedCornersTransformation.CornerType.ALL))
//                .into(mImageView);
//       Glide.with(mContext).load(path).transform(new GlideRoundTransform(mContext,5)).into(mImageView);
//        Glide.with(mContext).load(path).centerCrop().bitmapTransform
//                (new RoundedCornersTransformation(mContext,15,0, RoundedCornersTransformation.CornerType.ALL))
//                .into(mImageView);
//  }

    //设置圆形图片
    public static void loadImageViewCircle(Context mContext, String path, ImageView mImageView, int loadImgRes) {
        if (path.contains("key=null") || path.endsWith("key=")) {
            mImageView.setImageResource(loadImgRes);
            return;
        }
        GlideApp.with(mContext)
                .load(path)
                .transform(new GlideCircleTransform(mContext))
                .placeholder(loadImgRes)
                .skipMemoryCache(false)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(mImageView);
    }

    //设置圆形图片
    public static void loadImageViewCircle(Context mContext, int resId, ImageView mImageView) {
        GlideApp.with(mContext)
                .load(resId)
                .transform(new GlideCircleTransform(mContext))
                .dontAnimate()
                .skipMemoryCache(false)
                .into(mImageView);
    }

    //    //设置圆形图片带边框
//    public static void loadImageViewCircle(Context mContext, String path, ImageView mImageView,int loadImgRes,int boildercolor) {
//        Glide.with(mContext)
//                .load(path)
//                .transform(new GlideCircleTransform(mContext,1,boildercolor))
//                .placeholder(loadImgRes)
//                .crossFade()
//                .into(mImageView);
//    }
    //设置圆角图片（url）
    public static void loadImageViewCornersByPath(Context mContext, String path, ImageView mImageView) {
        if (TextUtils.isEmpty(path) || (path.contains("key=null") || path.endsWith("key="))) {
            mImageView.setImageResource(R.mipmap.image_error_icon);
            return;
        }
        GlideApp.with(mContext)
                .load(path)
//                .signature(new ObjectKey(String.valueOf(System.currentTimeMillis())))
                .transform(new GlideRoundTransform(mContext, 5))
                .error(R.mipmap.image_error_icon)
                .placeholder(R.mipmap.image_loading_icon)
                .skipMemoryCache(false)
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)//缓存缩略过的
                .into(mImageView);
    }

    public static void loadImageViewCornersByPathTwo(Context mContext, String path, ImageView mImageView) {
        if (TextUtils.isEmpty(path) || (path.contains("key=null") || path.endsWith("key="))) {
            mImageView.setImageResource(R.mipmap.image_error_icon);
            return;
        }
        GlideApp.with(mContext)
                .load(path)
                .transform(new GlideRoundTransform(mContext, 5))
                .error(R.mipmap.image_error_icon)
                .placeholder(R.mipmap.image_loading_icon)
                .skipMemoryCache(false)
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)//缓存缩略过的
                .into(mImageView);
    }

    public static void loadImageViewCornersByBytes(Context mContext, byte[] bytes, ImageView mImageView) {
        if (null == bytes || bytes.length == 0) {
            mImageView.setImageResource(R.mipmap.image_error_icon);
            return;
        }
        GlideApp.with(mContext)
                .load(bytes)
                .centerCrop()
//                .signature(new ObjectKey(String.valueOf(System.currentTimeMillis())))
                .transform(new GlideRoundTransform(mContext, 5))
                .error(R.mipmap.image_error_icon)
                .placeholder(R.mipmap.image_loading_icon)
                .skipMemoryCache(false)
                .into(mImageView);
    }

    /**
     * 加载正常图片（非圆角）
     *
     * @param context
     * @param path
     * @param imageView
     * @param isFile
     */
    public static void loadImage(Context context, String path, ImageView imageView, boolean isFile) {
        if (isFile) {
            GlideApp.with(context)
                    .load(new File(path))
                    .into(imageView);
        } else {
            if (path.contains("key=null") || path.endsWith("key=")) {
                return;
            }
            GlideApp.with(context)
                    .load(path)
//                    .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
//                    .signature(new ObjectKey(String.valueOf(System.currentTimeMillis())))
                    .into(imageView);
        }
    }

    /**
     * 加载正常图片（非圆角）-自定义
     *
     * @param context
     * @param path
     * @param imageView
     */
    public static void loadCustomImage(Context context, String path, ImageView imageView) {
        if (path.endsWith("key=null") || path.endsWith("key=")) {
            imageView.setImageResource(R.mipmap.image_error_icon);
            return;
        }
        RequestOptions myoptions = new RequestOptions()
                .placeholder(R.mipmap.image_loading_icon)
                .error(R.mipmap.image_error_icon);
        GlideApp.with(context)
                .load(path)
                .apply(myoptions)
                .into(imageView);
//        Glide.with(MyApplication.getContext())
//                .load(path)
//                .into(imageView);
    }

    public static void loadMapImage(Context context, String url, ImageView imageView) {
        if (url.contains("key=null") || url.endsWith("key=")) {
            imageView.setImageResource(R.mipmap.image_error_icon);
            return;
        }
        Log.e("tag======", "url=" + url);
        GlideApp.with(context)
                .load(url)
                .into(imageView);
    }
    //设置圆角图片
    public static void loadImageViewTransformation(Context mContext, int resId, ImageView mImageView) {
        GlideApp.with(mContext).load(resId).transform(new GlideRoundTransform(mContext, 2)).into(mImageView);
    }

    /**
     * 有头像生成头像，没有头像根据姓名生成占位头像
     *
     * @param context 上下文
     * @param url     图片
     * @param name    姓名
     * @param view    控件
     */
    public static void loadHeadImg(Context context, @NonNull String url, @NonNull String name, @NonNull CustomHeadImageView view) {
//       loadImg(context, url, name, view, true);
    }

    /**
     * @param context    上下文
     * @param url        加载路径
     * @param name       用户昵称
     * @param view       靶标
     * @param addBaseUrl 是否拼接base url
     */

    private static void loadImg(Context context, @NonNull String url, @NonNull String name, @NonNull CustomHeadImageView view, boolean addBaseUrl) {
        final int width = view.getWidth();
        final int height = view.getHeight();
        if (TextUtils.isEmpty(url) || TextUtils.equals("0", url)) {
            //直接设置默认头像
            if (width <= 0 || height <= 0) {
                view.post(() -> {
                    int width1 = view.getWidth();
                    int height1 = view.getHeight();
                    view.setImageDrawable(getDefaultDrawable(name, width1, height1));
                });
            } else {
                view.setImageDrawable(getDefaultDrawable(name, width, height));
            }

            return;
        }
//        if (addBaseUrl) {
//            url = ServerImageDown + url;
//        }
        String finalUrl = url;
        view.post(() -> Glide.with(context)
                .load(finalUrl)
                .apply(getHeadIvOptions(name, width, height))
                .into(view));

    }

    /**
     * @param name   用户名
     * @param width  宽
     * @param height 高
     */
    private static RequestOptions getHeadIvOptions(String name, int width, int height) {
        return getRequestOptions()
                .placeholder(getDefaultDrawable(name, width, height))
                .error(getDefaultDrawable(name, width, height));
    }

    /**
     * @return RequestOptions
     */
    private static RequestOptions getRequestOptions() {
        return new RequestOptions();
    }

    /**
     * 获取默认drawable
     */
    private static TextDrawable getDefaultDrawable(String name, int width, int height) {
        return TextDrawable.getDefaultDrawable(name, width, height);
    }

    /**
     * 加载图片若引起oom则缩略加载
     * @param context
     * @param url
     * @param thumb
     * @param mImageView
     */
    public static void showImgWithThumbnail(Context context, String url, float thumb, ImageView mImageView, boolean isFile) {
        try {
            if (isFile){
                GlideApp.with(context).load(new File(url)).thumbnail(thumb).into(mImageView);
            } else {
                GlideApp.with(context).load(url).thumbnail(thumb).into(mImageView);
            }
        } catch (OutOfMemoryError e) {
            thumb -= 0.2f;
            if (thumb <= 0) {
                thumb = 0.1f;
            }
            showImgWithThumbnail(context,url, thumb,mImageView,isFile);
        }
    }
//
//    //加载指定大小
//    public static void loadImageViewSize(Context mContext, String path, int width, int height, ImageView mImageView) {
//        Glide.with(mContext).load(path).override(width, height).into(mImageView);
//    }
//
//    //设置加载中以及加载失败图片
//    public static void loadImageViewLoding(Context mContext, String path, ImageView mImageView, int lodingImage, int errorImageView) {
//        Glide.with(mContext).load(path).placeholder(lodingImage).error(errorImageView).into(mImageView);
//    }
//
//    //设置加载中以及加载失败图片并且指定大小
//    public static void loadImageViewLodingSize(Context mContext, String path, int width, int height, ImageView mImageView, int lodingImage, int
// errorImageView) {
//        Glide.with(mContext).load(path).override(width, height).placeholder(lodingImage).error(errorImageView).into(mImageView);
//    }
//
//    //设置跳过内存缓存
//    public static void loadImageViewCache(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).skipMemoryCache(true).into(mImageView);
//    }
//
//    //设置下载优先级
//    public static void loadImageViewPriority(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).priority(Priority.NORMAL).into(mImageView);
//    }
//
//    /**
//     * 策略解说：
//     * <p>
//     * all:缓存源资源和转换后的资源
//     * <p>
//     * none:不作任何磁盘缓存
//     * <p>
//     * source:缓存源资源
//     * <p>
//     * result：缓存转换后的资源
//     */
//
//    //设置缓存策略
//    public static void loadImageViewDiskCache(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).diskCacheStrategy(DiskCacheStrategy.ALL).into(mImageView);
//    }
//
//    /**
//     * api也提供了几个常用的动画：比如crossFade()
//     */
//
//    //设置加载动画
//    public static void loadImageViewAnim(Context mContext, String path, int anim, ImageView mImageView) {
//        Glide.with(mContext).load(path).animate(anim).into(mImageView);
//    }
//
//    /**
//     * 会先加载缩略图
//     */
//
//    //设置缩略图支持
//    public static void loadImageViewThumbnail(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).thumbnail(0.1f).into(mImageView);
//    }
//
//    /**
//     * api提供了比如：centerCrop()、fitCenter()等
//     */
//
//    //设置动态转换
//    public static void loadImageViewCrop(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).centerCrop().into(mImageView);
//    }
//
//    //设置动态GIF加载方式
//    public static void loadImageViewDynamicGif(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).asGif().into(mImageView);
//    }
//    //设置动态GIF加载方式
//    public static void loadImageViewDynamicGif(Context mContext, int resId, ImageView mImageView) {
//        Glide.with(mContext).load(resId).asGif().into(mImageView);
//    }
//
//    //设置静态GIF加载方式
//    public static void loadImageViewStaticGif(Context mContext, String path, ImageView mImageView) {
//        Glide.with(mContext).load(path).asBitmap().into(mImageView);
//    }
//
//    //设置监听的用处 可以用于监控请求发生错误来源，以及图片来源 是内存还是磁盘
//
//    //设置监听请求接口
//    public static void loadImageViewListener(Context mContext, String path, ImageView mImageView, RequestListener<String, GlideDrawable>
// requstlistener) {
//        Glide.with(mContext).load(path).listener(requstlistener).into(mImageView);
//    }
//
//    //项目中有很多需要先下载图片然后再做一些合成的功能，比如项目中出现的图文混排
//
//    //设置要加载的内容
//    public static void loadImageViewContent(Context mContext, String path, SimpleTarget<GlideDrawable> simpleTarget) {
//        Glide.with(mContext).load(path).centerCrop().into(simpleTarget);
//    }
//
//    //清理磁盘缓存
//    public static void GuideClearDiskCache(Context mContext) {
//        //理磁盘缓存 需要在子线程中执行
//        Glide.get(mContext).clearDiskCache();
//    }
//
//    //清理内存缓存
//    public static void GuideClearMemory(Context mContext) {
//        //清理内存缓存  可以在UI主线程中进行
//        Glide.get(mContext).clearMemory();
////    }
//
//    private class CircularBitmapImageViewTarget  extends BitmapImageViewTarget {
//        private Context context;
//        private ImageView imageView;
//        public CircularBitmapImageViewTarget(Context context,ImageView view) {
//            super(view);
//            this.context=context;
//            this.imageView=view;
//        }
//        /**
//         * 重写 setResource（），生成圆角的图片
//         * @param resource
//         */
//        @Override
//        protected void setResource(Bitmap resource) {
//            RoundedBitmapDrawable bitmapDrawable= RoundedBitmapDrawableFactory.create(this.context.getResources(),resource);
//            /**
//             *   设置图片的shape为圆形.
//             *
//             *   若是需要制定圆角的度数，则调用setCornerRadius（）。
//             */
//            bitmapDrawable.setCircular(true);
//            int size = DensityUtils.dp2px(context,5f);
//            bitmapDrawable.setCornerRadius(size);
//            this.imageView.setImageDrawable(bitmapDrawable);
//        }
//    }
}
